#include <func.h>
#include <stdio.h>
#include "Task.h"
void upload_file(void* arg, Thread* thread)
{
    // 1. 解析参数
    Param* param = (Param*) arg;
    // 文件大小 sha256sum  路径
    int epfd = param->epfd;
    int connfd = param->connfd;
    long fsize = atol(strtok(param->req.value, SPACES));
    const char* sha256sum = strtok(NULL, SPACES);
    const char* path = strtok(NULL, SPACES);
    printf("%ld %s %s\n", fsize, sha256sum, path);

    // 3. 判断文件是否已存在
    MYSQL* mysql = thread->mysql;
    char stmt[1024];
    sprintf(stmt, "SELECT * FROM files WHERE sha256sum = '%s'", sha256sum);
    mysql_query(mysql, stmt);

    MYSQL_RES* result = mysql_store_result(mysql);
    unsigned long rows = mysql_num_rows(result);
    mysql_free_result(result);

    Response resp;
    if (rows != 0) {
        // 文件已存在，文件不需要再传
        resp.status = RESP_EXIST;
        resp.length = 0;

        int length = 2 * sizeof(int);
        send(connfd, &length, sizeof(int), MSG_WAITALL);
        send(connfd, &resp, length, MSG_WAITALL);
        return ;
    }
    // 文件不存在
    resp.status = RESP_NOEXIST;
    resp.length = 0;
    int length = 2 * sizeof(int);
    send(connfd, &length, sizeof(int), MSG_WAITALL);
    send(connfd, &resp, length, MSG_WAITALL);

    // 接收文件
    int fd = open(sha256sum, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    char buf[4096];
    long nbytes = 0;
    while (nbytes < fsize) {
        int length = fsize - nbytes >= 4096 ? 4096 : fsize - nbytes;
        int n = recv(connfd, buf, length, MSG_WAITALL);
        if (n == -1) {
            // 发生错误
            fprintf(stderr, "recv(): %s\n", strerror(errno));
        } else if (n == 0) {
            // 对端断开连接
        } else {
            write(fd, buf, n);
            nbytes += n;
        }
    }

    // === 新增注册表相关操作 ===
    // 1. 创建文件记录
    file_create(mysql, sha256sum, fsize);  // 假设文件总大小为 fsize
    int file_id = file_exist(mysql, sha256sum);
    if (file_id == 0) {
        printf("Failed to create file record in database\n");
        close(fd);
        free(arg);
        return;
    }

    // 2. 检查路径是否存在（假设路径已绑定用户）
    //int path_id = path_exist(mysql, path);
    //if (path_id == 0) {
    //    // 路径不存在，创建路径（假设用户ID为 0 或默认值）
    //    path_create(mysql, 0, path, 'f');  // 'f' 表示文件类型
    //    path_id = path_exist(mysql, path);
    //    if (path_id == 0) {
    //        printf("Failed to create path record in database\n");
    //        close(fd);
    //        free(arg);
    //        return;
    //    }
    //}

    // 3. 关联路径与文件（分片序号默认为 0）
    //pathtofile_create(mysql, path_id, file_id, 0);

    // === 注册表操作结束 ===

    epoll_add(epfd, connfd);
    free(arg);
    close(fd);
}
